Webããã©ãŒãã³ã¹ãé«éåãCSSã°ãªããã®ã¬ã€ã¢ãŠãèšç®ããããã¡ã€ãªã³ã°ãããã©ãã¯ãµã€ãžã³ã°ã®åœ±é¿ãåæãChrome DevToolsã§ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãæé©åããæ¹æ³ã解説ã
CSSã°ãªããã®ãã©ãã¯ãµã€ãžã³ã°ã«ãããããã©ãŒãã³ã¹ãããã¡ã€ãªã³ã°ïŒã¬ã€ã¢ãŠãèšç®åæã®æ·±æã
CSSã°ãªããã¯Webã¬ã€ã¢ãŠãã«é©åœããããããè€éã§ã¬ã¹ãã³ã·ããªãã¶ã€ã³ãäœæããããã®åäŸã®ãªããã¯ãŒãšæè»æ§ãæäŸããŸãã`fr`åäœã`minmax()`ãã³ã³ãã³ãã«å¿ãããµã€ãžã³ã°ãšãã£ãæ©èœã«ããããã€ãŠã¯å€¢ç©èªã ã£ãã€ã³ã¿ãŒãã§ãŒã¹ããé©ãã»ã©å°ãªãã³ãŒãã§æ§ç¯ã§ããŸãããããã倧ããªåã«ã¯å€§ããªè²¬ä»»ã䌎ããŸããWebããã©ãŒãã³ã¹ã®äžçã§ã¯ããã®è²¬ä»»ã¯ç§ãã¡ã®ãã¶ã€ã³éžæãããããèšç®ã³ã¹ããçè§£ããããšã«ãããŸãã
ç§ãã¡ã¯JavaScriptã®å®è¡ãç»åã®èªã¿èŸŒã¿ã®æé©åã«éäžããã¡ã§ãããéèŠã§ãããªããèŠéããããã¡ãªããã©ãŒãã³ã¹ã®ããã«ããã¯ãããã©ãŠã¶ã®ã¬ã€ã¢ãŠãèšç®ãã§ãŒãºã§ãããã©ãŠã¶ãããŒãžäžã®èŠçŽ ã®ãµã€ãºãšäœçœ®ã決å®ããå¿ èŠããããã³ã«ããã¬ã€ã¢ãŠããæäœãå®è¡ãããŸããè€éãªCSSãç¹ã«æŽç·Žãããã°ãªããæ§é ã¯ããã®ããã»ã¹ãèšç®ã³ã¹ãã®é«ããã®ã«ããåå¿ã®éãã€ã³ã¿ã©ã¯ã·ã§ã³ãã¬ã³ããªã³ã°ã®é å»¶ããããŠè²§åŒ±ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªããå¯èœæ§ããããŸããããã§ãããã©ãŒãã³ã¹ãããã¡ã€ãªã³ã°ã¯åãªããããã°ããŒã«ã§ã¯ãªããèšèšã»éçºããã»ã¹ã«ãããéèŠãªäžéšãšãªãã®ã§ãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãCSSã°ãªããã®ããã©ãŒãã³ã¹ã®äžçãæ·±ãæãäžããŠãããŸããç§ãã¡ã¯æ§æãè¶ ããããã©ãŒãã³ã¹ã®éãã®èåŸã«ããããªãããæ¢æ±ããŸãããã©ãŠã¶ã®éçºè ããŒã«ã䜿çšããŠãã°ãªããã®ãã©ãã¯ãµã€ãžã³ã°æŠç¥ã«ãã£ãŠåŒãèµ·ããããã¬ã€ã¢ãŠãã®ããã«ããã¯ã枬å®ãåæã蚺æããæ¹æ³ãåŠã³ãŸããèªã¿çµããé ã«ã¯ãçŸããã¬ã¹ãã³ã·ãã§ããã ãã§ãªããè¶ é«éãªã¬ã€ã¢ãŠããæ§ç¯ããããã®ç¥èã身ã«ã€ããŠããããšã§ãããã
ãã©ãŠã¶ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãçè§£ãã
æé©åããåã«ããŸãæ¹åããããšããŠããããã»ã¹ãçè§£ããªããã°ãªããŸããããã©ãŠã¶ãWebããŒãžãã¬ã³ããªã³ã°ããéã«ã¯ãäžè¬çã«ã¯ãªãã£ã«ã«ã¬ã³ããªã³ã°ãã¹ãšåŒã°ããäžé£ã®ã¹ãããã«åŸããŸããæ£ç¢ºãªçšèªã¯ãã©ãŠã¶ã«ãã£ãŠè¥å¹²ç°ãªãå ŽåããããŸãããäž»èŠãªæ®µéã¯æŠãäžè²«ããŠããŸãã
- ã¹ã¿ã€ã«ïŒ ãã©ãŠã¶ã¯CSSãè§£æããåDOMèŠçŽ ã®æçµçãªã¹ã¿ã€ã«ã決å®ããŸããããã«ã¯ãã»ã¬ã¯ã¿ãŒã®è§£æ±ºãã«ã¹ã±ãŒãã®åŠçããã¹ãŠã®ããŒãã®èšç®æžã¿ã¹ã¿ã€ã«ã®ç®åºãå«ãŸããŸãã
- ã¬ã€ã¢ãŠãïŒãŸãã¯ãªãããŒïŒïŒ ãããç§ãã¡ã®äž»èŠãªçŠç¹ã§ããã¹ã¿ã€ã«ãèšç®ãããåŸããã©ãŠã¶ã¯åèŠçŽ ã®ãžãªã¡ããªãèšç®ããŸããåèŠçŽ ãããŒãžã®ã©ãã«é 眮ãããã¹ãããã©ãã ãã®ã¹ããŒã¹ãå æããããæ±ºå®ããŸããå¹ ãé«ããäœçœ®ãªã©ã®å¹ŸäœåŠæ å ±ãå«ããã¬ã€ã¢ãŠãããªãŒããŸãã¯ãã¬ã³ããŒããªãŒããäœæããŸãã
- ãã€ã³ãïŒ ãã®æ®µéã§ããã©ãŠã¶ã¯ãã¯ã»ã«ãå¡ãã€ã¶ããŸããåã®ã¹ãããã§äœæãããã¬ã€ã¢ãŠãããªãŒãåãåãããããç»é¢äžã®äžé£ã®ãã¯ã»ã«ã«å€æããŸããããã«ã¯ãããã¹ããè²ãç»åãå¢çç·ã圱ãªã©ãèŠçŽ ã®ãã¹ãŠã®èŠèŠçãªéšåã®æç»ãå«ãŸããŸãã
- ã³ã³ããžããïŒ ãã©ãŠã¶ã¯ããã€ã³ããããæ§ã ãªã¬ã€ã€ãŒãæ£ããé åºã§ç»é¢ã«æç»ããŸããéãªãåã£ããã`transform`ã`opacity`ã®ãããªç¹å®ã®ããããã£ãæã€èŠçŽ ã¯ãåŸç¶ã®æŽæ°ãæé©åããããã«ããã°ãã°ç¬èªã®ã¬ã€ã€ãŒã§åŠçãããŸãã
ãªããã¬ã€ã¢ãŠãããã§ãŒãºãã°ãªããã®ããã©ãŒãã³ã¹ã«ãšã£ãŠéèŠãªã®ã
åçŽãªãããã¯èŠçŽ ãšã€ã³ã©ã€ã³èŠçŽ ãããªãããã¥ã¡ã³ãã®ã¬ã€ã¢ãŠããã§ãŒãºã¯ãæ¯èŒçåçŽã§ãããã©ãŠã¶ã¯ãã°ãã°èŠçŽ ãäžåºŠã®ãã¹ã§åŠçãã芪èŠçŽ ã«åºã¥ããŠãããã®å¯žæ³ãèšç®ã§ããŸããããããCSSã°ãªããã¯æ°ããªã¬ãã«ã®è€éããå°å ¥ããŸããã°ãªããã³ã³ããã¯å¶çŽããŒã¹ã®ã·ã¹ãã ã§ããã°ãªãããã©ãã¯ãã¢ã€ãã ã®æçµçãªãµã€ãºã¯ãä»ã®ãã©ãã¯ã®ãµã€ãºãã³ã³ããå ã®å©çšå¯èœãªã¹ããŒã¹ããããã¯å åŒã¢ã€ãã å ã®ã³ã³ãã³ãã®åºæã®ãµã€ãºã«ããäŸåããããšããããããŸãã
ãã©ãŠã¶ã®ã¬ã€ã¢ãŠããšã³ãžã³ã¯ãæçµçãªã¬ã€ã¢ãŠãã«å°éããããã«ããã®è€éãªæ¹çšåŒç³»ãè§£ããªããã°ãªããŸãããã°ãªãããã©ãã¯ã®å®çŸ©æ¹æ³ãã€ãŸããµã€ãžã³ã°åäœã颿°ã®éžæãããã®ã·ã¹ãã ãè§£ãé£æåºŠãã²ããŠã¯æèŠæéã«çŽæ¥åœ±é¿ããŸãã`grid-template-columns`ã®äºçްã«èŠãã倿Žããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã«äžé£ãåããªåœ±é¿ãäžããå¯èœæ§ãããã®ã¯ãã®ããã§ãã
CSSã°ãªãããã©ãã¯ãµã€ãžã³ã°ã®æ§é ïŒããã©ãŒãã³ã¹ã®èгç¹ãã
广çã«ãããã¡ã€ãªã³ã°ããããã«ã¯ãå©çšå¯èœãªããŒã«ã®ããã©ãŒãã³ã¹ç¹æ§ãçè§£ããå¿ èŠããããŸããäžè¬çãªãã©ãã¯ãµã€ãžã³ã°ã®ã¡ã«ããºã ãåè§£ãããããã®æœåšçãªèšç®ã³ã¹ããåæããŸãããã
1. éçã§äºæž¬å¯èœãªãµã€ãžã³ã°
ãããã¯æãåçŽã§ããã©ãŒãã³ã¹ã®é«ããªãã·ã§ã³ã§ãããªããªããã¬ã€ã¢ãŠããšã³ãžã³ã«æç¢ºã§ææ§ãã®ãªãæ å ±ãæäŸããããã§ãã
- åºå®åäœïŒ`px`, `rem`, `em`ïŒïŒ ãã©ãã¯ã`grid-template-columns: 200px 10rem;`ã®ããã«å®çŸ©ãããšããã©ãŠã¶ã¯ãããã®ãã©ãã¯ã®æ£ç¢ºãªãµã€ãºãå³åº§ã«ç¥ãããšãã§ããŸããè€éãªèšç®ã¯å¿ èŠãããŸãããããã¯èšç®ã³ã¹ããéåžžã«äœãã§ãã
- ããŒã»ã³ããŒãžåäœïŒ`%`ïŒïŒ ããŒã»ã³ããŒãžã¯ã°ãªããã³ã³ããã®ãµã€ãºãåºæºã«è§£æ±ºãããŸãã芪ã®å¹ ãååŸãããšãã远å ã®ã¹ããããå¿ èŠã§ãããããã§ãéåžžã«é«éã§æ±ºå®è«çãªèšç®ã§ãããã©ãŠã¶ã¯ãããã®ãµã€ãºãã¬ã€ã¢ãŠãããã»ã¹ã®æ©ã段éã§è§£æ±ºã§ããŸãã
ããã©ãŒãã³ã¹ãããã¡ã€ã«ïŒ éçããã³ããŒã»ã³ããŒãžãµã€ãžã³ã°ã®ã¿ã䜿çšããã¬ã€ã¢ãŠãã¯ãéåžžéåžžã«é«éã§ãããã©ãŠã¶ã¯ã°ãªããã®ãžãªã¡ããªãäžåºŠã®å¹ççãªãã¹ã§è§£æ±ºã§ããŸãã
2. ãã¬ãã·ãã«ãªãµã€ãžã³ã°
ãã®ã«ããŽãªã¯æè»æ§ãå°å ¥ãããã©ãã¯ãå©çšå¯èœãªã¹ããŒã¹ã«é©å¿ã§ããããã«ããŸããéçãªãµã€ãžã³ã°ããã¯å°ãè€éã§ãããçŸä»£ã®ãã©ãŠã¶ã§ã¯é«åºŠã«æé©åãããŠããŸãã
- åæ°åäœïŒ`fr`ïŒïŒ `fr`åäœã¯ãã°ãªããã³ã³ããå ã®å©çšå¯èœãªã¹ããŒã¹ã®åæ°ã衚ããŸãã`fr`åäœã解決ããããã«ããã©ãŠã¶ã¯ãŸããéãã¬ãã·ãã«ãªãã©ãã¯ïŒ`px`ã`auto`ãã©ãã¯ãªã©ïŒãå ããã¹ããŒã¹ãå·®ãåŒããæ®ãã®ã¹ããŒã¹ã`fr`ãã©ãã¯ã®åæ°ã«å¿ããŠåé ããŸãã
ããã©ãŒãã³ã¹ãããã¡ã€ã«ïŒ `fr`åäœã®èšç®ã¯è€æ°ã¹ãããã®ããã»ã¹ã§ãããã°ãªããã¢ã€ãã ã®ã³ã³ãã³ãã«äŸåããªããæç¢ºã«å®çŸ©ãããæ°åŠçæäœã§ããã»ãšãã©ã®äžè¬çãªãŠãŒã¹ã±ãŒã¹ã§ã¯ãéåžžã«é«ãããã©ãŒãã³ã¹ãçºæ®ããŸãã
3. ã³ã³ãã³ãããŒã¹ã®ãµã€ãžã³ã°ïŒããã©ãŒãã³ã¹ã®ãããã¹ãããïŒ
ãããããé¢çœãããããŠæœåšçã«é ããªãéšåã§ããã³ã³ãã³ãããŒã¹ã®ãµã€ãžã³ã°ããŒã¯ãŒãã¯ããã©ãŠã¶ã«å¯ŸããŠããã®äžã«ããã¢ã€ãã ã®ã³ã³ãã³ãã«åºã¥ããŠãã©ãã¯ã®ãµã€ãºã決å®ããããæç€ºããŸããããã«ãããã³ã³ãã³ããšã¬ã€ã¢ãŠãã®éã«åŒ·åãªé¢é£æ§ãçãŸããŸãããããã«ã¯èšç®ã³ã¹ãã䌎ããŸãã
- `min-content`ïŒã³ã³ãã³ãã®åºæã®æå°å¹ ã衚ããŸããããã¹ãã®å Žåãããã¯éåžžãæãé·ãåèªãŸãã¯æ¹è¡äžå¯èœãªæååã®å¹ ã§ãããããèšç®ããããã«ããã©ãŠã¶ã®ã¬ã€ã¢ãŠããšã³ãžã³ã¯ãã®æãåºãéšåãèŠã€ããããã«ãæŠå¿µçã«ã³ã³ãã³ããã¬ã€ã¢ãŠãããå¿ èŠããããŸãã
- `max-content`ïŒã³ã³ãã³ãã®åºæã®æšå¥šå¹ ã衚ããŸããããã¯ãæç€ºçã«æå®ãããæ¹è¡ä»¥å€ã«æ¹è¡ããªãå Žåã«ã³ã³ãã³ããå ããå¹ ã§ãããããèšç®ããããã«ããã©ãŠã¶ã¯æŠå¿µçã«ã³ã³ãã³ãå šäœãäžæ¬ã®ç¡éã«é·ãè¡ã«ã¬ã€ã¢ãŠãããå¿ èŠããããŸãã
- `auto`ïŒãã®ããŒã¯ãŒãã¯æèã«äŸåããŸããã°ãªãããã©ãã¯ã®ãµã€ãžã³ã°ã«äœ¿çšãããå Žåãã¢ã€ãã ãåŒã䌞ã°ããããããµã€ãºãæå®ãããŠããªãéããäžè¬çã«`max-content`ã®ããã«åäœããŸãããã©ãŠã¶ãã³ã³ãã³ãã®ãµã€ãºã決å®ããããã«ãã°ãã°æž¬å®ããå¿ èŠãããããããã®è€éãã¯`max-content`ã«äŒŒãŠããŸãã
ããã©ãŒãã³ã¹ãããã¡ã€ã«ïŒ ãããã®ããŒã¯ãŒãã¯æãèšç®ã³ã¹ããé«ãã§ãããªãã§ããããïŒãªããªããåæ¹åã®äŸåé¢ä¿ãçã¿åºãããã§ããã³ã³ããã®ã¬ã€ã¢ãŠãã¯ã¢ã€ãã ã®ã³ã³ãã³ãã®ãµã€ãºã«äŸåããŸãããã¢ã€ãã ã®ã³ã³ãã³ãã®ã¬ã€ã¢ãŠããã³ã³ããã®ãµã€ãºã«äŸåããå¯èœæ§ããããŸããããã解決ããããã«ããã©ãŠã¶ã¯è€æ°ã®ã¬ã€ã¢ãŠããã¹ãå®è¡ããå¿ èŠããããããããŸããããã©ãã¯èªäœã®æçµçãªãµã€ãºãèšç®ãå§ããåã«ããŸããã®ãã©ãã¯å ã®ãã¹ãŠã®ã¢ã€ãã ã®ã³ã³ãã³ããæž¬å®ããå¿ èŠããããŸããå€ãã®ã¢ã€ãã ãæã€ã°ãªããã§ã¯ããããé倧ãªããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã
4. 颿°ããŒã¹ã®ãµã€ãžã³ã°
颿°ã¯ãç°ãªããµã€ãžã³ã°ã¢ãã«ãçµã¿åãããæ¹æ³ãæäŸããæè»æ§ãšå¶åŸ¡ã®äž¡æ¹ãæäŸããŸãã
- `minmax(min, max)`ïŒãã®é¢æ°ã¯ãµã€ãºã®ç¯å²ãå®çŸ©ããŸãã`minmax()`ã®ããã©ãŒãã³ã¹ã¯ããã®åŒæ°ã«äœ¿çšãããåäœã«å®å šã«äŸåããŸãã`minmax(200px, 1fr)`ã¯ãåºå®å€ãšãã¬ãã·ãã«ãªå€ãçµã¿åããããããéåžžã«ããã©ãŒãã³ã¹ãé«ãã§ãããããã`minmax(min-content, 500px)`ã¯`min-content`ã®ããã©ãŒãã³ã¹ã³ã¹ããç¶æ¿ããŸãããªããªãããã©ãŠã¶ã¯ãããæå€§å€ãã倧ãããã©ããã確èªããããã«ãäŸç¶ãšããŠãããèšç®ããå¿ èŠãããããã§ãã
- `fit-content(value)`ïŒããã¯å®è³ªçã«ã¯ã©ã³ãã§ãã`minmax(auto, max-content)`ã«çžåœããŸãããäžãããã`value`ã§ã¯ã©ã³ããããŸãããããã£ãŠã`fit-content(300px)`ã¯`minmax(min-content, max(min-content, 300px))`ã®ããã«åäœããŸããããããŸããã³ã³ãã³ãããŒã¹ã®ãµã€ãžã³ã°ã®ããã©ãŒãã³ã¹ã³ã¹ãã䌎ããŸãã
ããã®ããŒã«ïŒChrome DevToolsã«ãããããã¡ã€ãªã³ã°
çè«ã¯æçšã§ãããããŒã¿ã¯æ±ºå®çã§ããå®éã®ç°å¢ã§ã°ãªããã¬ã€ã¢ãŠããã©ã®ããã«æ©èœããããçè§£ããã«ã¯ãããããæž¬å®ããå¿ èŠããããŸããGoogle Chromeã®DevToolsã®Performanceããã«ã¯ããã®ããã®äžå¯æ¬ ãªããŒã«ã§ãã
ããã©ãŒãã³ã¹ãããã¡ã€ã«ã®èšé²æ¹æ³
å¿ èŠãªããŒã¿ããã£ããã£ããã«ã¯ãæ¬¡ã®æé ã«åŸããŸãïŒ
- Chromeã§WebããŒãžãéããŸãã
- DevToolsãéããŸãïŒF12ãCtrl+Shift+IããŸãã¯Cmd+Opt+IïŒã
- Performanceã¿ãã«ç§»åããŸãã
- ã¿ã€ã ã©ã€ã³ã«æçšãªããŒã«ãŒã衚瀺ããããã«ããWeb Vitalsããã§ãã¯ããã¯ã¹ããªã³ã«ãªã£ãŠããããšã確èªããŸãã
- Recordãã¿ã³ïŒåïŒãã¯ãªãã¯ããããCtrl+EãæŒããŸãã
- ãããã¡ã€ãªã³ã°ãããã¢ã¯ã·ã§ã³ãå®è¡ããŸããããã¯ãæåã®ããŒãžèªã¿èŸŒã¿ããã©ãŠã¶ãŠã£ã³ããŠã®ãªãµã€ãºããŸãã¯ã°ãªããã«åçã«ã³ã³ãã³ãã远å ããã¢ã¯ã·ã§ã³ïŒãã£ã«ã¿ãŒã®é©çšãªã©ïŒãèããããŸãããããã¯ãã¹ãŠã¬ã€ã¢ãŠãèšç®ãããªã¬ãŒããã¢ã¯ã·ã§ã³ã§ãã
- Stopãã¯ãªãã¯ããããå床Ctrl+EãæŒããŸãã
- DevToolsãããŒã¿ãåŠçãã詳现ãªã¿ã€ã ã©ã€ã³ã衚瀺ãããŸãã
ãã¬ãŒã ãã£ãŒãã®åæ
ãã¬ãŒã ãã£ãŒãã¯ãèšé²ã®äž»èŠãªèŠèŠç衚çŸã§ããã¬ã€ã¢ãŠãåæã§ã¯ããMainãã¹ã¬ããã»ã¯ã·ã§ã³ã«æ³šç®ããŸãã
ãRenderingããšã©ãã«ä»ããããé·ã玫è²ã®ããŒãæ¢ããŸãããããã®å éšã«ã¯ããLayoutããšã©ãã«ä»ããããããæã玫è²ã®ã€ãã³ãããããŸããããããããã©ãŠã¶ãããŒãžã®ãžãªã¡ããªãèšç®ããŠããç¹å®ã®ç¬éã§ãã
- é·ãã¬ã€ã¢ãŠãã¿ã¹ã¯ïŒ äžã€ã®é·ããLayoutããããã¯ã¯å±éºä¿¡å·ã§ããããã«ããŠã¹ãªãŒããŒããŠæç¶æéã確èªããŸãã匷åãªãã·ã³ã§æ°ããªç§ïŒäŸïŒ10ã15ms以äžïŒãããã¬ã€ã¢ãŠãã¿ã¹ã¯ã¯èª¿æ»ã«å€ããŸãããªããªããæ§èœã®äœãããã€ã¹ã§ã¯ã¯ããã«é ããªãããã§ãã
- ã¬ã€ã¢ãŠãã¹ã©ãã·ã³ã°ïŒ å°ããªãLayoutãã€ãã³ããçæéã§äœåºŠãçºçãããã°ãã°JavaScriptïŒãScriptingãã€ãã³ãïŒãšäº€äºã«çŸãããã¿ãŒã³ãæ¢ããŸãããã®ãã¿ãŒã³ã¯ã¬ã€ã¢ãŠãã¹ã©ãã·ã³ã°ãšããŠç¥ãããJavaScriptãç¹°ãè¿ããžãªã¡ããªããããã£ïŒ`offsetHeight`ãªã©ïŒãèªã¿åãããã®åŸãããç¡å¹ã«ããã¹ã¿ã€ã«ãæžã蟌ã¿ããã©ãŠã¶ã«ã«ãŒãå ã§äœåºŠãã¬ã€ã¢ãŠããåèšç®ãããå Žåã«çºçããŸãã
Summaryã¿ããšPerformance Monitorã®äœ¿çš
- Summaryã¿ãïŒ ãã¬ãŒã ãã£ãŒãã§æéç¯å²ãéžæããåŸãäžéšã®Summaryã¿ãã«è²»ããããæéã®å èš³ã瀺ãåã°ã©ãã衚瀺ãããŸãããRenderingããç¹ã«ãLayoutãã«å²ãåœãŠãããããŒã»ã³ããŒãžã«çްå¿ã®æ³šæãæã£ãŠãã ããã
- Performance MonitorïŒ ãªã¢ã«ã¿ã€ã åæã«ã¯ãPerformance MonitorãéããŸãïŒDevToolsã¡ãã¥ãŒããïŒMore tools > Performance monitorïŒãããã«ãããCPU䜿çšçãJSããŒããµã€ãºãDOMããŒãããããŠéèŠãªããšã«Layouts/secã®ã©ã€ãã°ã©ãã衚瀺ãããŸããããŒãžãšå¯Ÿè©±ãããã®ã°ã©ããæ¥äžæããã®ãèŠãããšã§ãã©ã®ã¢ã¯ã·ã§ã³ãé«ã³ã¹ããªã¬ã€ã¢ãŠãåèšç®ãåŒãèµ·ãããŠããããå³åº§ã«ç¥ãããšãã§ããŸãã
å®è·µçãªãããã¡ã€ãªã³ã°ã·ããªãªïŒçè«ããå®è·µãž
ããã€ãã®å®è·µçãªäŸã§ç¥èã詊ããŠã¿ãŸããããç°ãªãã°ãªããå®è£ ãæ¯èŒãããããã®ä»®æ³çãªããã©ãŒãã³ã¹ãããã¡ã€ã«ãåæããŸãã
ã·ããªãª1ïŒåºå®ïŒãã¬ãã·ãã«ïŒ`px`ããã³`fr`ïŒ vs. ã³ã³ãã³ãããŒã¹ïŒ`auto`ïŒ
100åã®ã¢ã€ãã ãæã€ååã°ãªãããæ³åããŠãã ãããã«ã©ã ã«å¯Ÿãã2ã€ã®ã¢ãããŒããæ¯èŒããŠã¿ãŸãããã
ã¢ãããŒãAïŒé«ããã©ãŒãã³ã¹ïŒïŒ åºå®ã®æå°å€ãšãã¬ãã·ãã«ãªæå€§å€ãæã€`minmax()`ã䜿çšã
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
ã¢ãããŒãBïŒæœåšçã«äœéïŒïŒ ã³ã³ãã³ãã«ã«ã©ã ãµã€ãºãå®çŸ©ãããããã«`auto`ãŸãã¯`max-content`ã䜿çšã
grid-template-columns: repeat(auto-fill, minmax(auto, 300px));
åæïŒ
- ã¢ãããŒãAã§ã¯ããã©ãŠã¶ã®ã¿ã¹ã¯ã¯åçŽã§ããåã¢ã€ãã ã®æå°å¹ ã250pxã§ããããšãç¥ã£ãŠããŸããã³ã³ããã®å¹ ã«äœåã®ã¢ã€ãã ãåãŸãããè¿ éã«èšç®ããæ®ãã®ã¹ããŒã¹ããããã®éã§åé ã§ããŸããããã¯ãã³ã³ãããå¶åŸ¡ããé«éãªå€éšïŒextrinsicïŒãµã€ãžã³ã°ã¢ãããŒãã§ããããã©ãŒãã³ã¹ãããã¡ã€ã«ã®ã¬ã€ã¢ãŠãã¿ã¹ã¯ã¯éåžžã«çããªããŸãã
- ã¢ãããŒãBã§ã¯ããã©ãŠã¶ã®ä»äºã¯ã¯ããã«å°é£ã§ãã`auto`ããŒã¯ãŒãïŒãã®æèã§ã¯ãã°ãã°`max-content`ã«è§£æ±ºãããïŒã¯ãåäžã®ã«ã©ã ã®å¹ ãæ±ºå®ããããã«ããã©ãŠã¶ããŸã100åã®ååã«ãŒãã®ãã¹ãŠã®ã³ã³ãã³ããä»®ã«ã¬ã³ããªã³ã°ããŠããã®`max-content`å¹ ãèŠã€ããªããã°ãªããªãããšãæå³ããŸãããã®åŸããã®æž¬å®å€ãã°ãªãã解決ã¢ã«ãŽãªãºã ã§äœ¿çšããŸãããã®å éšïŒintrinsicïŒãµã€ãžã³ã°ã¢ãããŒãã¯ãæçµçãªã¬ã€ã¢ãŠããæ±ºå®ãããåã«ã倧éã®äºåã®æž¬å®äœæ¥ãå¿ èŠãšããŸããããã©ãŒãã³ã¹ãããã¡ã€ã«ã®ã¬ã€ã¢ãŠãã¿ã¹ã¯ã¯ãæ¡éãã«é·ããªãå¯èœæ§ããããŸãã
ã·ããªãª2ïŒæ·±ããã¹ããããã°ãªããã®ã³ã¹ã
ã°ãªããã®ããã©ãŒãã³ã¹åé¡ã¯è€åçã«çºçããå¯èœæ§ããããŸãã芪ã°ãªãããã³ã³ãã³ãããŒã¹ã®ãµã€ãžã³ã°ã䜿çšãããã®åããŸãè€éãªã°ãªããã§ããã¬ã€ã¢ãŠããèããŠã¿ãŸãããã
äŸïŒ
ã¡ã€ã³ããŒãžã®ã¬ã€ã¢ãŠãã¯2ã«ã©ã ã®ã°ãªããã§ãïŒ`grid-template-columns: max-content 1fr;`ãæåã®ã«ã©ã ã¯ãããŸããŸãªãŠã£ãžã§ãããå«ããµã€ãããŒã§ãããããã®ãŠã£ãžã§ããã®1ã€ã¯ã«ã¬ã³ããŒã§ãããèªäœãCSSã°ãªããã§æ§ç¯ãããŠããŸãã
åæïŒ
ãã©ãŠã¶ã®ã¬ã€ã¢ãŠããšã³ãžã³ã¯ãå°é£ãªäŸåé¢ä¿ã®é£éã«çŽé¢ããŸãïŒ
- ã¡ã€ã³ããŒãžã®`max-content`ã«ã©ã ã解決ããã«ã¯ããµã€ãããŒã®`max-content`å¹ ãèšç®ããå¿ èŠããããŸãã
- ãµã€ãããŒã®å¹ ãèšç®ããã«ã¯ãã«ã¬ã³ããŒãŠã£ãžã§ãããå«ããã¹ãŠã®åã®å¹ ãèšç®ããå¿ èŠããããŸãã
- ã«ã¬ã³ããŒãŠã£ãžã§ããã®å¹ ãèšç®ããã«ã¯ãããèªèº«ã®å éšã°ãªããã¬ã€ã¢ãŠãã解決ããå¿ èŠããããŸãã
芪ã®èšç®ã¯ãåã®ã¬ã€ã¢ãŠããå®å šã«è§£æ±ºããããŸã§ãããã¯ãããŸãããã®æ·±ãçµåã¯ãé©ãã»ã©é·ãã¬ã€ã¢ãŠãæéãåŒãèµ·ããå¯èœæ§ããããŸããåã°ãªãããã³ã³ãã³ãããŒã¹ã®ãµã€ãžã³ã°ã䜿çšããŠããå Žåãåé¡ã¯ããã«æªåããŸãããã®ãããªããŒãžããããã¡ã€ãªã³ã°ãããšãããããæåã®ã¬ã³ããªã³ã°äžã«åäžã®éåžžã«é·ããLayoutãã¿ã¹ã¯ãæããã«ãªãã§ãããã
æé©åæŠç¥ãšãã¹ããã©ã¯ãã£ã¹
ç§ãã¡ã®åæã«åºã¥ããŠã髿§èœãªã°ãªããã¬ã€ã¢ãŠããæ§ç¯ããããã®ããã€ãã®ã¢ã¯ã·ã§ã³å¯èœãªæŠç¥ãå°ãåºãããšãã§ããŸãã
1. å éšïŒIntrinsicïŒãµã€ãžã³ã°ããå€éšïŒExtrinsicïŒãµã€ãžã³ã°ãåªå ãã
ããã¯ã°ãªããããã©ãŒãã³ã¹ã®é»éåŸã§ããå¯èœãªéããã°ãªããã³ã³ããã«`px`ã`rem`ã`%`ã`fr`ãªã©ã®åäœã䜿çšããŠãã©ãã¯ã®å¯žæ³ãå®çŸ©ãããŸããããã«ããããã©ãŠã¶ã®ã¬ã€ã¢ãŠããšã³ãžã³ã¯æç¢ºã§äºæž¬å¯èœãªå¶çŽã»ããã§äœæ¥ã§ããããé«éãªèšç®ãå¯èœã«ãªããŸãã
ããã®ä»£ããã«ïŒå éšïŒïŒ
grid-template-columns: repeat(auto-fit, max-content);
ãã¡ããåªå ããïŒå€éšïŒïŒ
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
2. ã³ã³ãã³ãããŒã¹ã®ãµã€ãžã³ã°ã®ç¯å²ãå¶éãã
`min-content`ã`max-content`ã«ã¯ãããããããŠã³ã¡ãã¥ãŒããã©ãŒã ãã£ãŒã«ãã®æšªã®ã©ãã«ãªã©ãæ£åœãªãŠãŒã¹ã±ãŒã¹ããããŸãããããã䜿çšããªããã°ãªããªãå Žåã¯ããã®åœ±é¿ãå¶éããããã«åªããŠãã ããïŒ
- å°æ°ã®ãã©ãã¯ã«é©çšããïŒ äœçŸãã®ã¢ã€ãã ãæã€ç¹°ãè¿ããã¿ãŒã³ã§ã¯ãªããåäžã®ã«ã©ã ãè¡ã§äœ¿çšããŸãã
- 芪ãå¶çŽããïŒ ã³ã³ãã³ãããŒã¹ã®ãµã€ãžã³ã°ã䜿çšããã°ãªãããã`max-width`ãæã€ã³ã³ããå ã«é 眮ããŸããããã«ãããã¬ã€ã¢ãŠããšã³ãžã³ã«å¢çãäžããããèšç®ãæé©åããã®ã«åœ¹ç«ã€å ŽåããããŸãã
- `minmax()`ãšçµã¿åãããïŒ `minmax(200px, max-content)`ã®ããã«ãã³ã³ãã³ãããŒã¹ã®ããŒã¯ãŒããšäžç·ã«é©åãªæå°å€ãŸãã¯æå€§å€ãæäŸããŸããããã«ããããã©ãŠã¶ã¯èšç®ãæå©ã«éå§ã§ããŸãã
3. `subgrid`ãçè§£ããè³¢ã䜿çšãã
`subgrid`ã¯ããã¹ããããã°ãªããã芪ã°ãªããã®ãã©ãã¯å®çŸ©ãæ¡çšã§ããããã«ãã匷åãªæ©èœã§ããããã¯é 眮ã«éåžžã«åªããŠããŸãã
ããã©ãŒãã³ã¹ãžã®åœ±é¿ïŒ `subgrid`ã¯è«žåã®å£ã«ãªãå¯èœæ§ããããŸããäžæ¹ã§ã¯ã芪ãšåã®ã¬ã€ã¢ãŠãèšç®ã®çµå床ãé«ããçè«çã«ã¯æåã®è€éãªã¬ã€ã¢ãŠã解決ãé ãããå¯èœæ§ããããŸãã仿¹ã§ã¯ãã¢ã€ãã ãæåããå®å šã«æŽåãããããšã§ãä»ã®æ¹æ³ã§æåã§é çœ®ãæš¡å£ããããšããå Žåã«çºçããå¯èœæ§ã®ããåŸç¶ã®ã¬ã€ã¢ãŠãã·ããããªãããŒãé²ãããšãã§ããŸããæåã®ã¢ããã€ã¹ã¯ãããã¡ã€ãªã³ã°ããããšã§ããè€éãªãã¹ããããã¬ã€ã¢ãŠããããå Žåã¯ã`subgrid`ã®æç¡ã§ããã©ãŒãã³ã¹ã枬å®ããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã§ã©ã¡ããåªããŠãããã確èªããŠãã ããã
4. ä»®æ³åïŒå€§èŠæš¡ããŒã¿ã»ããã«å¯Ÿãã究極ã®ãœãªã¥ãŒã·ã§ã³
äœçŸãäœåãã®ã¢ã€ãã ãæã€ã°ãªããïŒããŒã¿ã°ãªãããç¡éã¹ã¯ããŒã«ã®åçã®ã£ã©ãªãŒãªã©ïŒãæ§ç¯ããŠããå Žåãã©ãã ãCSSã調æŽããŠãæ ¹æ¬çãªåé¡ãå æããããšã¯ã§ããŸããïŒãã©ãŠã¶ã¯äŸç¶ãšããŠãã¹ãŠã®èŠçŽ ã®ã¬ã€ã¢ãŠããèšç®ããªããã°ãªããªãã®ã§ãã
解決çã¯ä»®æ³åïŒãŸãã¯ããŠã£ã³ããŠã€ã³ã°ãïŒã§ããããã¯JavaScriptããŒã¹ã®ãã¯ããã¯ã§ãçŸåšãã¥ãŒããŒãã«è¡šç€ºãããŠããå°æ°ã®DOMèŠçŽ ã®ã¿ãã¬ã³ããªã³ã°ããŸãããŠãŒã¶ãŒãã¹ã¯ããŒã«ãããšããããã®DOMããŒããåå©çšãããã®å 容ã眮ãæããŸããããã«ãããããŒã¿ã»ããã«100åã®ã¢ã€ãã ãããããš100,000åã®ã¢ã€ãã ãããããšãã¬ã€ã¢ãŠãèšç®äžã«ãã©ãŠã¶ãåŠçããªããã°ãªããªãèŠçŽ ã®æ°ãå°ããäžå®ã«ä¿ã¡ãŸãã
`react-window`ã`tanstack-virtual`ã®ãããªã©ã€ãã©ãªã¯ããã®ãã¿ãŒã³ã®å ç¢ãªå®è£ ãæäŸããŠããŸããæ¬åœã«å€§èŠæš¡ãªã°ãªããã®å Žåãããã¯ããªããã§ããæã广çãªããã©ãŒãã³ã¹æé©åã§ãã
ã±ãŒã¹ã¹ã¿ãã£ïŒååäžèЧã°ãªããã®æé©å
ã°ããŒãã«ãªeã³ããŒã¹ãµã€ãã®çŸå®çãªæé©åã·ããªãªãèŠãŠãããŸãããã
åé¡ç¹ïŒ ååäžèЧããŒãžã®åäœãéãæããããŸãããã©ãŠã¶ãŠã£ã³ããŠã®ãµã€ãºã倿Žããããããã£ã«ã¿ãŒãé©çšãããããããšãååãæ°ããäœçœ®ã«åé 眮ããããŸã§ã«é¡èãªé å»¶ãçºçããŸããInteraction to Next Paint (INP) ã®Core Web Vitalsã¹ã³ã¢ãäœãã§ãã
åæã³ãŒãïŒãBeforeãã®ç¶æ ïŒïŒ
ã°ãªããã¯éåžžã«æè»ã«å®çŸ©ãããŠãããååã«ãŒãããã®ã³ã³ãã³ãïŒäŸãã°ãé·ãåååïŒã«åºã¥ããŠã«ã©ã å¹ ãæ±ºå®ã§ããããã«ãªã£ãŠããŸãã
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fill, fit-content(320px));
gap: 1rem;
}
ããã©ãŒãã³ã¹åæïŒ
- ãã©ãŠã¶ãŠã£ã³ããŠããªãµã€ãºããªããããã©ãŒãã³ã¹ãããã¡ã€ã«ãèšé²ããŸãã
- ãã¬ãŒã ãã£ãŒãã«ã¯ããªãµã€ãºã€ãã³ããçºç«ãããã³ã«ãå¹³åçãªããã€ã¹ã§80ms以äžãããé·ããç¹°ãè¿ãçºçãããLayoutãã¿ã¹ã¯ã衚瀺ãããŸãã
- `fit-content()`颿°ã¯`min-content`ããã³`max-content`ã®èšç®ã«äŸåããŠããŸãããããã¡ã€ã©ã¯ããªãµã€ãºããšã«ããã©ãŠã¶ãã°ãªããæ§é ãåèšç®ããããã«ã衚瀺ãããŠãããã¹ãŠã®ååã«ãŒãã®ã³ã³ãã³ããå¿ æ»ã«å枬å®ããŠããããšã確èªããŸãããããé å»¶ã®åå ã§ãã
解決çïŒãAfterãã®ç¶æ ïŒïŒ
å éšçãªã³ã³ãã³ãããŒã¹ã®ãµã€ãžã³ã°ã¢ãã«ãããå€éšçãªã³ã³ããå®çŸ©ã®ã¢ãã«ã«åãæ¿ããŸããã«ãŒãã«ãã£ãããšããæå°ãµã€ãºãèšå®ããå©çšå¯èœãªã¹ããŒã¹ã®åæ°ãŸã§æè»ã«åºããããã«ããŸãã
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1rem;
}
ååã«ãŒãã®CSSå éšã«ããã®æ°ãããããåçŽãªã³ã³ããå ã§æœåšçã«é·ãã³ã³ãã³ããé©åã«åŠçããããã®ã«ãŒã«ã远å ããŸãïŒ
.product-title {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
çµæïŒ
- ãªãµã€ãºããªããæ°ããããã©ãŒãã³ã¹ãããã¡ã€ã«ãèšé²ããŸãã
- ãã¬ãŒã ãã£ãŒãã«ã¯ããLayoutãã¿ã¹ã¯ãéåžžã«çããäžè²«ããŠ5msæªæºã§ããããšã瀺ãããŸãã
- ãã©ãŠã¶ã¯ãã¯ãã³ã³ãã³ããæž¬å®ããå¿ èŠããããŸãããã³ã³ããã®å¹ ãš`280px`ã®æå°å€ã«åºã¥ããŠåçŽãªæ°åŠçèšç®ãå®è¡ããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã¯äžå€ããŸãããªãµã€ãºã¯ã¹ã ãŒãºã§ç¬æã«è¡ãããŸãããã©ãŠã¶ãæ°ããã¬ã€ã¢ãŠããã»ãŒå³åº§ã«èšç®ã§ããããããã£ã«ã¿ãŒã®é©çšãæ©æã«æããããŸãã
ã¯ãã¹ãã©ãŠã¶ãŒããŒã«ã«é¢ããæ³šæç¹
ãã®ã¬ã€ãã¯Chrome DevToolsã«çŠç¹ãåœãŠãŠããŸãããããŠãŒã¶ãŒã¯å€æ§ãªãã©ãŠã¶ã奜ãããšãèŠããŠããããšãéèŠã§ããFirefoxã®éçºè ããŒã«ã«ã¯ãåæ§ã®ãã¬ãŒã ãã£ãŒããšåææ©èœãæäŸããåªããããã©ãŒãã³ã¹ããã«ïŒãã°ãã°ããããã¡ã€ã©ããšåŒã°ããïŒããããŸããSafariã®Webã€ã³ã¹ãã¯ã¿ã«ããã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ããããã¡ã€ãªã³ã°ããããã®åŒ·åãªãã¿ã€ã ã©ã€ã³ãã¿ããå«ãŸããŠããŸãããã¹ãŠã®ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«äžè²«ããé«å質ãªäœéšãä¿èšŒããããã«ãåžžã«äž»èŠãªãã©ãŠã¶ã§æé©åããã¹ãããŠãã ããã
çµè«ïŒèšèšã«ããé«ããã©ãŒãã³ã¹ãªã°ãªããã®æ§ç¯
CSSã°ãªããã¯éåžžã«åŒ·åãªããŒã«ã§ããããã®æãé«åºŠãªæ©èœã«ã¯èšç®ã³ã¹ãã䌎ããŸããå€çš®å€æ§ãªããã€ã¹ãšãããã¯ãŒã¯ç¶æ³ãæã€ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«éçºããWebãããã§ãã·ã§ãã«ãšããŠãç§ãã¡ã¯éçºããã»ã¹ã®æåããããã©ãŒãã³ã¹ãæèããªããã°ãªããŸããã
éèŠãªãã€ã³ãã¯æç¢ºã§ãïŒ
- ã¬ã€ã¢ãŠãã¯ããã©ãŒãã³ã¹ã®ããã«ããã¯ïŒ ã¬ã³ããªã³ã°ã®ãã¬ã€ã¢ãŠãããã§ãŒãºã¯ãç¹ã«CSSã°ãªããã®ãããªè€éãªå¶çŽããŒã¹ã®ã·ã¹ãã ã§ã¯ã³ã¹ããé«ããªãå¯èœæ§ããããŸãã
- ãµã€ãžã³ã°æŠç¥ãéèŠïŒ å€éšçãªãã³ã³ããå®çŸ©ã®ãµã€ãžã³ã°ïŒ`px`, `fr`, `%`ïŒã¯ãå éšçãªãã³ã³ãã³ãããŒã¹ã®ãµã€ãžã³ã°ïŒ`min-content`, `max-content`, `auto`ïŒãããã»ãŒåžžã«ããã©ãŒãã³ã¹ãé«ãã§ãã
- æšæž¬ãããæž¬å®ããïŒ ãã©ãŠã¶ã®ããã©ãŒãã³ã¹ãããã¡ã€ã©ã¯ãããã°ã®ããã ãã®ãã®ã§ã¯ãããŸãããã¬ã€ã¢ãŠãã®éžæãåæããæé©åãæ€èšŒããããã«ç©æ¥µçã«äœ¿çšããŠãã ããã
- äžè¬çãªã±ãŒã¹ã«æé©åããïŒ å€§éã®ã¢ã€ãã ã³ã¬ã¯ã·ã§ã³ã®å ŽåãåçŽãªå€éšã°ãªããå®çŸ©ã¯ãè€éãªã³ã³ãã³ã察å¿ã®ãã®ãããåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããŸãã
宿çãªã¯ãŒã¯ãããŒã«ããã©ãŒãã³ã¹ãããã¡ã€ãªã³ã°ãçµ±åããããšã§ãCSSã°ãªããã䜿çšããŠæŽç·Žããããã¬ã¹ãã³ã·ãã§å ç¢ãªã¬ã€ã¢ãŠããæ§ç¯ããããããèŠèŠçã«çŽ æŽãããã ãã§ãªããäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠä¿¡ããããªãã»ã©é«éã§ã¢ã¯ã»ã¹ãããããã®ã§ãããšç¢ºä¿¡ã§ããŸãã